package qc.module.ehs.api.controller;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.*;
import qc.common.core.constants.QCAuthConstant;
import qc.common.core.exception.QCPromptException;
import qc.module.ehs.dto.hazard.EhsHazardInfoDto;
import qc.module.ehs.dto.hazardledger.*;
import qc.module.ehs.service.EhsHazardInfoService;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * HazardLedgerController
 * 危险源台账
 *
 * @author QuCheng Tech
 * @create 2024/11/5
 */
@RestController
@RequestMapping("/hazardledger")
public class HazardLedgerController {

    @Autowired
    private EhsHazardInfoService hazardInfoService;

    @Autowired
    HttpServletRequest request;

    @Autowired
    private OrgController orgController;

    /**
     * 查询危险源台账
     *
     * @param condition 查询条件
     * @return HazardLedgerQueryResultDto
     * @author QuCheng Tech
     * @description 按危险源清单/台账查询危险源信息；显示查询结果中的危险源统计信息：一般危险源数量、重大危险源数量、第一类、第二类危险源数量、各风险等级危险源数量，可以在表格上显示汇总行。
     * 查询结果只返回辨识结果存在的危险源。
     * @since 2024/11/6
     */
    @RequestMapping(value = "/query",method = {RequestMethod.GET,RequestMethod.POST})
    public HazardLedgerQueryResultDto query(@RequestBody HazardLedgerQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        List<Integer> deptIds = null;
        //如果查询条件中指定需要根据用户所在部门进行过滤，获取用户所在部门集合
        if (condition.isIsdept() == true) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
            headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));

            deptIds = orgController.getUserDeptIds(condition.getOrgcode(), headers);
        }

        return hazardInfoService.query(condition, deptIds);
    }

    /**
     * 按单元查询危险源
     *
     * @param condition 查询条件
     * @return QueryHazardByUnitResultDto
     * @author QuCheng Tech
     * @since 2024/11/6
     * @description 
     *      表格数据说明：返回用户所在组织中的所有独立场所/区域单元（需判断台账模式还是辨识评价模式），需要处理查询条件中的单元下拉选择条件；
     *      返回结果中不管是否有对应单元辨识记录，均返回单元名称信息，其他列信息保持为空；
     *      单元有层级关系，按层级关系显示。上级单元与子级单元的危险源数量之间不做关联。
     *      台账模式下只能进行查询和数据显示，辨识评价模式下才能进行操作。辨识评价模式单元需要根据用户部门进行过滤。
     */
    @RequestMapping(value = "/byunit",method = {RequestMethod.GET,RequestMethod.POST})
    public QueryHazardByUnitResultDto queryByUnit(@RequestBody QueryHazardByUnitConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        List<Integer> deptIds = null;
        //如果查询条件中指定需要根据用户所在部门进行过滤，获取用户所在部门集合
        if (condition.isIsdept() == true) {
            HttpHeaders headers = new HttpHeaders();
            headers.add(QCAuthConstant.TOKEN_HEADER_KEY, request.getHeader(QCAuthConstant.TOKEN_HEADER_KEY));
            headers.add(QCAuthConstant.PROJECT_CODE_HEADER_KEY, request.getHeader(QCAuthConstant.PROJECT_CODE_HEADER_KEY));

            deptIds = orgController.getUserDeptIds(condition.getOrgcode(), headers);
        }

        return hazardInfoService.queryByUnit(condition, deptIds);
    }

    /**
     * 指定单元查询危险源
     * 
     * @param id 单元ID
     * @return QueryOneUnitHazardResultDto
     * @author QuCheng Tech
     * @since 2024/11/6
     * @description 返回指定单元的危险源信息
     */
    @GetMapping("/oneunit")
    public QueryOneUnitHazardResultDto getOneUnitByParam(@RequestParam String id) throws QCPromptException {
        return hazardInfoService.getOneUnit(id);
    }

    /**
     * 指定单元查询危险源
     *
     * @param id 单元ID
     * @return QueryOneUnitHazardResultDto
     * @author QuCheng Tech
     * @since 2024/11/6
     * @description 返回指定单元的危险源信息
     */
    @GetMapping("/oneunit/{id}")
    public QueryOneUnitHazardResultDto getOneUnitByPath(@PathVariable String id) throws QCPromptException {
        return hazardInfoService.getOneUnit(id);
    }

    /**
     * 获取指定单元的第一类危险源
     *
     * @param id 单元ID
     * @return List<EhsHazardInfoDto>
     * @author QuCheng Tech
     * @since 2024/10/18
     */
    @GetMapping("/unithazards")
    public List<EhsHazardInfoDto> getUnitHazardsByParam(@RequestParam String id) throws QCPromptException {
        return hazardInfoService.getUnitHazards(id);
    }

    /**
     * 获取指定单元的第一类危险源
     *
     * @param id 单元ID
     * @return List<EhsHazardInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/6
     */
    @GetMapping("/unithazards/{id}")
    public List<EhsHazardInfoDto> getUnitHazardsByPath(@PathVariable String id) throws QCPromptException {
        return hazardInfoService.getUnitHazards(id);
    }

    /**
     * 获取指定单元的隐患（第二类危险源）
     *
     * @param id 单元ID
     * @return List<EhsHazardInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/6
     */
    @GetMapping("/unithiddentrouble")
    public List<EhsHazardInfoDto> getUnitHiddenTroubleByParam(@RequestParam String id) throws QCPromptException {
        return hazardInfoService.getUnitHiddenTrouble(id);
    }

    /**
     * 获取指定单元的隐患（第二类危险源）
     *
     * @param id 单元ID
     * @return List<EhsHazardInfoDto>
     * @author QuCheng Tech
     * @since 2024/11/6
     */
    @GetMapping("/unithiddentrouble/{id}")
    public List<EhsHazardInfoDto> getUnitHiddenTroubleByPath(@PathVariable String id) throws QCPromptException {
        return hazardInfoService.getUnitHiddenTrouble(id);
    }
}
